package com.ccc.javacv.response;

import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;

import java.io.IOException;

/***
 * HTTP发送数据处理
 *  ResponseBodyEmitter进行Streaming输出
 *
 *  知识：Spring MVC的异步模式（HTTP Streaming - ResponseBodyEmitter）
 *  Spring MVC的异步请求——使用ResponseBodyEmitter进行异步处理
 *  HTTP Streaming是一种推送形式的数据传输技术，它通过无限期开放的HTTP连接让web服务器（tomcat）能持续向客户端（浏览器）传送数据。
 *  在HTTP Streaming下，web服务器会握住客户端的请求并让返回保持开放，这样服务器可以通过返回一直发送数据。这个请求-返回的通道会一直开启，除非我们显示的要求关闭。
 *  我们可以使用ResponseBodyEmitter作为返回值，返回数据对象的流。
 */
public class HttpEmitterDataSender implements DataSender {

    private final ResponseBodyEmitter emitter;
    
    public HttpEmitterDataSender(ResponseBodyEmitter emitter) {
        this.emitter = emitter;
    }
    
    @Override
    public void send(byte[] data) throws IOException {
        emitter.send(data);
    }
    
    @Override
    public void close() {
        emitter.complete();
    }
}
